Hito 3

En este informe se detallan los procesos de clustering efectuacos por el equipo en las bases de datos de partidos de selecciones nacionales desde el año 1993 hasta el 2018, que muestran información del ránking de los equipos juntos con variables que cuenten sobre la racha que llevan.

Por otro lado, se presenta una nueva base de datos que contiene información exclusivamente relacionado a partidos disputados en copas del mundo, desde 1930 hasta 2018. En esta oportunidad se posee información sobre la fase del partidos, el público asistente, y datos, bastante interesantes, como lo son las nacionalidades de los árbitros, y el marcador al primer tiempo.

Base de datos selecciones nacionales

En esta sección se cargan las base de dato correspodiente a los partidos de selecciones nacionales desde el año 1993 en todo tipo torneo, incluyendo la variable que cuenta sobre el ránking de los equipos en disputa.

BD <- read.csv("BaseCOMPLETA.csv",sep=";")

BD <- BD[,-1]

head(BD,5)
##         date home_team    away_team home_score away_score
## 1 08-08-1993   Bolivia      Uruguay          3          1
## 2 08-08-1993    Brazil       Mexico          1          1
## 3 08-08-1993   Ecuador    Venezuela          5          0
## 4 08-08-1993    Guinea Sierra Leone          1          0
## 5 08-08-1993  Paraguay    Argentina          1          3
##                     tournament     city  country neutral Rankinglocal
## 1 FIFA World Cup qualification   La Paz  Bolivia   FALSE           59
## 2                     Friendly   Maceió   Brazil   FALSE            8
## 3 FIFA World Cup qualification    Quito  Ecuador   FALSE           35
## 4                     Friendly  Conakry   Guinea   FALSE           65
## 5 FIFA World Cup qualification Asunción Paraguay   FALSE           67
##   RankingVisita VictoriaLocal VictoriaVisita RachaLocal RachaVisita Empate
## 1            22             1              0          0           0      0
## 2            14             0              0          0           0      1
## 3            94             1              0          0           0      0
## 4            86             1              0          0           0      0
## 5             5             0              1          0           0      0
##   Clase ultimo HistoriaLocal HistoriaVisita
## 1     1      0             0              0
## 2     3      0             0              0
## 3     1      0             0              0
## 4     1      0             0              0
## 5     2      0             0              0

Atributos

Se carga una base de datos con los atributos procesados previamente, teniendo:

  • Ranking de los equipos.
  • Torneo que se disputa el partido.
  • Ciudad y país donde se disputa el partido.
  • Racha de los equipos.
  • Historia de los equipos.
  • Ultimo enfrentamiento de los equipos.
AtributosSelecciones <- read.csv("Atributos.csv")

Análisis exploratorio preliminar

Un primer análisis sobre los datos existentes ( Revisar Hito 1 para más detalles).

length(unique(BD$home_team))
## [1] 281
length(unique(BD$away_team))
## [1] 280
length(unique(BD$country))
## [1] 232
length(unique(BD$tournament))
## [1] 69
length(unique(BD$city))
## [1] 1587
mean(BD$home_score)
## [1] 1.652711
mean(BD$away_score)
## [1] 1.10018

Clustering

Se procede a realizar clustering para estos datos buscando identificar grupos de partidos con características similares

Elbow

Se inicia realizando un gráfico elbow para determinar la cantidad de cluster a formar en función de este metodo.

tot_withinss <- map_dbl(1:12,  function(k){
  model <- kmeans(x = AtributosSelecciones[,-c(1,2,3,4,13,14)], centers =k)
  model$tot.withinss
})

elbow_df <- data.frame(
  k = 1:12 ,
  tot_withinss = tot_withinss
)

# Plot the elbow plot
ggplot(elbow_df, aes(x = k, y = tot_withinss)) +
  geom_line() +
  scale_x_continuous(breaks = 1:12)+labs(title="Elbow")

Kmeans

Es así que se opta por realizar cuatro cluster.

set.seed(22)
modelkmSeleccion <- kmeans(AtributosSelecciones[,-c(1,2,3,4,13,14)],center=4, nstart = 20)
Cluster<- modelkmSeleccion$cluster
ClusteringKMSeleccion <- mutate(AtributosSelecciones,cluster=Cluster)

Caracterización de cluster

modelkmSeleccion$centers
##     neutral Rankinglocal RankingVisita RachaLocal RachaVisita   ultimo
## 1 0.2219273    114.34688      45.89751  0.4360964   0.7692936 1.467742
## 2 0.3166624    138.97550     144.99311  0.4924726   0.4536872 1.372034
## 3 0.3127061     27.44902      29.34162  0.9657621   0.9062896 1.404514
## 4 0.2270367     47.56230     113.13918  0.8200879   0.4081470 1.258986
##   HistoriaLocal HistoriaVisita
## 1     0.1553199      0.4083145
## 2     0.3152880      0.2677828
## 3     0.2774420      0.2574004
## 4     0.4244062      0.1572893

De los cluster formados, se tiene que el primer cluster corresponde a partidos en donde el equipo local tiene un ranking peor que el ranking del equipo visitante, junto con que el equipo en calidad de visita viene con mejor racha. En el segundo cluster, ambos equipos no poseen un buen ranking, ni vienen con buena racha. En el cluster número tres, las dos selecciones tienen un ranking alto, y vienen con buena racha. En el último cluster el equipo local tiene un mucho mejor que ranking que el visitante, y también viene con mejor racha.

Visualización de cluster

ggplot(ClusteringKMSeleccion,aes(x=Rankinglocal,y=RankingVisita, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Ranking equipo local vs Ranking equipo visitante", x="Ranking equipo local", y="Ranking equipo visitante", col="Cluster")

ggplot(ClusteringKMSeleccion,aes(x=Rankinglocal,y=HistoriaVisita, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Ranking equipo local vs Historia equipo visitante", x="Ranking equipo local", y="Historia equipo visitante", col="Cluster")

ggplot(ClusteringKMSeleccion,aes(x=RankingVisita,y=HistoriaLocal, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Ranking equipo visitante vs Historia equipo local", x="Ranking equipo visitante", y="Historia equipo local", col="Cluster")

ggplot(ClusteringKMSeleccion,aes(x=RachaLocal,y=RankingVisita, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Racha equipo local vs Ranking equipo visitante", x="Racha equipo local", y="Ranking equipo visitante", col="Cluster")

De las anteriores gráficas se evidencia la existencia de grupos de partidos, y que estos atributos tienen potencial para describir y predecir el resultado de un partido.

Base de datos de mundiales

En esta seccion se estudia el comportamiento que tienen las selecciones al estar disputando una Copa del Mundo, máximo torneo de fútbol a nivel mundial.

Esta base de datos no contiene información del ránking puesto que aquello se implementó en el año 1993, por lo que para los datos anteriores a esa fecha no existía una calificación. Por contra parte se cuenta con información sobre los marcadores al primer tiempo, y la instancia en la cual se está jugando.

data <- read.csv("BD_Mundial.csv",sep=";")

data <- data[,-c(1)]
head(data,6)
##   home_team        away_team home_score away_score year     X       date
## 1       USA      Switzerland          1          1 1994 18276 18-06-1994
## 2   Algeria Northern Ireland          1          1 1986 14105 03-06-1986
## 3   Algeria            Spain          0          3 1986 14137 12-06-1986
## 4 Argentina         Bulgaria          2          0 1986 14130 10-06-1986
## 5 Argentina          England          2          1 1986 14153 22-06-1986
## 6 Argentina          Germany          3          2 1986 14159 29-06-1986
##       tournament        city country neutral VictoriaLocal VictoriaVisita
## 1 FIFA World Cup     Pontiac     USA       0             0              0
## 2 FIFA World Cup Guadalajara  Mexico       1             0              0
## 3 FIFA World Cup   Monterrey  Mexico       1             0              1
## 4 FIFA World Cup Mexico City  Mexico       1             1              0
## 5 FIFA World Cup Mexico City  Mexico       1             1              0
## 6 FIFA World Cup Mexico City  Mexico       1             1              0
##   RachaLocal RachaVisita     Fecha   Hora          Stage
## 1          1           0 18-jun-94  11:30        Group A
## 2          0           1 03-jun-86  12:00        Group D
## 3          0           1 12-jun-86  12:00        Group D
## 4          0           0 10-jun-86  12:00        Group A
## 5          2           2 22-jun-86  12:00 Quarter-finals
## 6          4           1 29-jun-86  12:00          Final
##                            Stadium        City Win.conditions Attendance
## 1               Pontiac Silverdome     Detroit           <NA>      73425
## 2                    Tres de Marzo Guadalajara           <NA>      22000
## 3                      Tecnologico   Monterrey           <NA>      23980
## 4 Estadio Ol�mpico Universitario Mexico City           <NA>      65000
## 5                   Estadio Azteca Mexico City           <NA>     114580
## 6                   Estadio Azteca Mexico City           <NA>     114600
##   Half.time.Home.Goals Half.time.Away.Goals                        Referee
## 1                    1                    1 LAMOLINA Francisco Oscar (ARG)
## 2                    0                    1           BUTENKO Valeri (RUS)
## 3                    0                    1            TAKADA Shizuo (JPN)
## 4                    1                    0       ULLOA MORERA Berny (CRC)
## 5                    0                    0            BENNACEUR Ali (TUN)
## 6                    1                    0     ARPPI FILHO Romualdo (BRA)
##   Referee.Nac                Assistant.1 Assistant.1.Nac
## 1         ARG        TAIBI Ernesto (ARG)             ARG
## 2         RUS          DAINA Andre (SUI)             SUI
## 3         JPN   PICON-ACKONG Edwin (MRI)             MRI
## 4         CRC ARPPI FILHO Romualdo (BRA)             BRA
## 5         TUN   ULLOA MORERA Berny (CRC)             CRC
## 6         BRA     FREDRIKSSON Erik (SWE)             SWE
##                      Assistant.2 Assistant.2.Nac RoundID MatchID
## 1          ZARATE Venancio (PAR)             PAR     337    3051
## 2           PETROVIC Zoran (SRB)             SRB     308     379
## 3          ESPOSITO Carlos (ARG)             ARG     308     378
## 4 MARTINEZ BAZAN Jose Luis (URU)             URU     308     389
## 5           DOTCHEV Bogdan (BUL)             BUL     714     392
## 6       ULLOA MORERA Berny (CRC)             CRC    3467     393
##   Home.Team.Initials Away.Team.Initials ultimo clase Empate HistoriaLocal
## 1                USA                SUI      0     3      1             0
## 2                ALG                NIR      0     3      1             0
## 3                ALG                ESP      0     2      0             0
## 4                ARG                BUL      1     1      0             1
## 5                ARG                ENG      2     1      0             0
## 6                ARG                FRG      2     1      0             0
##   HistoriaVisita Horario
## 1            0.0       1
## 2            0.0       1
## 3            0.0       1
## 4            0.0       1
## 5            1.0       1
## 6            0.5       1

Es así que se visualizan las principales variables que posee el dataset.

length(unique(data$home_team))
## [1] 76
length(unique(data$away_team))
## [1] 77
length(unique(data$country))
## [1] 16
length(unique(data$Stage))
## [1] 23
length(unique(data$Referee.Nac))
## [1] 83
mean(data$Half.time.Home.Goals)
## [1] 0.6330935
mean(data$Half.time.Away.Goals)
## [1] 0.5155875
mean(data$home_score)
## [1] 1.586331
mean(data$away_score)
## [1] 1.263789
data$first <- 0
for ( i in 1:nrow(data)){
  if(data$Half.time.Home.Goals[i]-data$Half.time.Away.Goals[i]>0) {data$first[i]=1}
  else if(data$Half.time.Home.Goals[i]-data$Half.time.Away.Goals[i]<0) {data$first[i]=2}
  else if(data$Half.time.Home.Goals[i]-data$Half.time.Away.Goals[i]==0) {data$first[i]=3}
}


data$vuelta <- "No cambio"
# 0 no
# 1 ganaba visita, gano local
# 2 ganaba local, gano visita
# 3 ganaba local, empataron
# 4 ganaba vista, empataron
# 5 empataba, gano local
# 6 empataba, gana visita
for ( i in 1:nrow(data)){
  if ( data$clase[i]==1 & data$first[i]==2){data$vuelta[i]="Ganaba visita, ganó local"}
  else if (data$clase[i]==2 & data$first[i]==1){data$vuelta[i]="Ganaba local, ganó visita"}
  else if (data$first[i]==1 & data$clase[i]==3){data$vuelta[i]="Ganaba local, empataron"}
  else if (data$first[i]==2 & data$clase[i]==3){data$vuelta[i]="Ganaba vista, empataron"}
  else if (data$first[i]==3 & data$clase[i]==1){data$vuelta[i]="Empataban, ganó local"}
  else if (data$first[i]==3 & data$clase[i]==2){data$vuelta[i]="Empataban, ganó visita"}
}
  
ggplot(data = data) +
  aes(x = vuelta) +
  geom_bar(fill = "#0c4c8a") +
  theme_minimal() + theme(axis.text.x = element_text(angle = 90, hjust = 1))

Atributos

Se carga una base de datos con los atributos procesados anteriormente, dejando exclusivamente las variables que se consideran relevantes en la conformación de un partido:

  • Las equipos involucrados.
  • Goles primer tiempo de local y visita.
  • Racha de equipo local y visita.
  • Historia pasada del equipo local y visita.
  • Público asistente.
  • La fase del partido.
  • El horario del partido.
  • La nacionalidad del árbitro.
  • La neutralidad de la cancha.
  • El país donde se disputó el partido.
rm(BD)
AtributosMundial <- read.csv("AtributosMundial.csv",sep=";")

AtributosMundial <- AtributosMundial[,-c(2,3,4,5,6,7,11,12,13,17,18,19,21,22,28,1)]

Análisis exploratorio preliminar

boxplot(AtributosMundial[,2:3], main= "Rachas")

boxplot(AtributosMundial[,4], main="Asistencia")

boxplot(AtributosMundial[,5:6], main="Goles al primer tiempo")

boxplot(AtributosMundial[,8:9], main="Historia ")

De las anteriores gráficas se observa cierta similitud, en los datos destacándose ciertos “outliers”. En particular, se detecta la existencia de equipos con muy buenas rachas lo que podría ser gatillante en el posterior resultado del partido. Existen partidos con una asistencia muy alta, que puede denotar instancias como finales, o partidos en donde los equipos son muy populares. En cuanto a la historia entre los equipos, tienden a tener una baja cantidad de triunfos, mostrando, sin embargo cierta superioridad de agunos equipos.

Clustering

Elbow

Se inicia realizando un gráfico elbow para determinar la cantidad de cluster a formar en función de este metodo

tot_withinss <- map_dbl(1:12,  function(k){
  model <- kmeans(x = AtributosMundial[,-c(4,13,14,15,16)], centers =k)
  model$tot.withinss
})

elbow_df <- data.frame(
  k = 1:12 ,
  tot_withinss = tot_withinss
)

# Plot the elbow plot
ggplot(elbow_df, aes(x = k, y = tot_withinss)) +
  geom_line() +
  scale_x_continuous(breaks = 1:12)+labs(title="Elbow")

Kmeans

Por lo que se realizan tres cluster, dado que gráficamente existe un quiebre en \(k=3\).

set.seed(22)
modelkm <- kmeans(AtributosMundial[,-c(4,13,14,15,16)],center=3, nstart = 20)
ClusterKM<- modelkm$cluster
ClusteringKM <- mutate(AtributosMundial,cluster=ClusterKM)

Caracterización de los cluster

modelkm$centers
##     neutral RachaLocal RachaVisita Half.time.Home.Goals
## 1 0.8636364  4.7575758   0.9545455            0.6136364
## 2 0.8765009  0.5283019   0.3602058            0.6535163
## 3 0.8151261  1.2268908   4.0756303            0.5546218
##   Half.time.Away.Goals    ultimo HistoriaLocal HistoriaVisita  Horario
## 1            0.3712121 0.6893939     0.2064394     0.13118687 1.954545
## 2            0.5008576 0.4957118     0.1467982     0.09033734 2.070326
## 3            0.7478992 0.7478992     0.1498599     0.20028011 1.882353
##       Fase Extra
## 1 2.727273     0
## 2 2.317324     0
## 3 3.411765     0

De lo anterior se visualiza la composición de los cluster, en donde se aprecia que el tercer cluster corresponde a partidos en donde el equipo visitante viene con una buena racha, mientras que el equipo local no. Lo que ocasiona que los goles al primer tiempo sean mayores para el equipo visitante. Este tipo de partidos se disputa comúnmente en fases altas del torneo.

El segundo cluster corresponde a partidos en donde ninguno de los dos equipos posee una buena racha, es decir, vienen con mal desempeño en los últimos partidos. En este grupo de partidos, suelen convertir más goles al primer tiempo los equipos locales.

En el primer cluster el equipo local es el equipo que posee un mejor desempeño, lo que a su vez se refleja en que posee, en promedio, más goles al primer tiempo.

Visualización de los cluster

ggplot(ClusteringKM,aes(x=RachaLocal,y=Half.time.Away.Goals, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Racha equipo local vs Cantidad de goles al primer tiempo equipo visitante", x="Racha local", y="Goles al primer tiempo equipo visitante", col="Cluster")

ggplot(ClusteringKM,aes(x=RachaVisita,y=Half.time.Home.Goals, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Racha equipo visita vs Cantidad de goles al primer tiempo equipo local", x="Racha visita", y="Goles al primer tiempo equipo local", col="Cluster")

ggplot(ClusteringKM,aes(x=RachaLocal,y=HistoriaVisita, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Racha equipo local vs Historia equipo visitante", x="Racha local", y="Historia equipo visitante", col="Cluster")

ggplot(ClusteringKM,aes(x=RachaLocal,y=RachaVisita, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Racha equipo local vs Racha equipo visitante", x="Racha local", y="Racha equipo visitante", col="Cluster")

Es así, que de los anteriores gráficos se visualiza claramente la composición de cada grupo de partidos, lo que da los primeros acercamientos de una posibilidad de usar estos atributos para clasificar los partidos.